1. MPC response overview
As of 11 April 2023, a total of 448,317 persons or NA families have
been reached by MPC interventions. A total of USD 13.3 million has been
disbursed by 17 implementing agencies across 28 sub-districts.
With only certain exceptions (such as activities specified as non-MPC
cash-for-food), only beneficiaries who have received at least USD
100/family/month have been included.
448,000 people reached with MPC, USD 13.3 million disbursed, 11 April 2023governorate | district | communities | partners | households | beneficiaries | total_usd | %_beneficiariesb |
|---|
Aleppo | A'zaz | 5 | 7 | 2,994 | 14,578 | 424,067 | 3.25 |
Aleppo | Afrin | 75 | 10 | 25,162 | 125,312 | 3,726,192 | 27.95 |
Aleppo | Al Bab | 3 | 2 | 998 | 5,011 | 137,791 | 1.12 |
Aleppo | Jarablus | 1 | 3 | 589 | 2,805 | 88,350 | 0.63 |
Aleppo | Jebel Saman | 15 | 8 | 9,226 | 53,754 | 1,380,550 | 11.99 |
Idleb | Harim | 38 | 13 | 43,136 | 204,566 | 6,273,250 | 45.63 |
Idleb | Idleb | 17 | 10 | 5,634 | 28,502 | 879,372 | 6.36 |
Idleb | Jisr-Ash-Shugur | 21 | 3 | 2,585 | 13,789 | 350,200 | 3.08 |
Total | - | - | - | 90,324 | 448,317 | 13,259,772 | 100.00 |
bAs percentage of all MPC beneficiaries reached in NW Syria; |
177,525 beneficiaries were reached in February 2023 and
rfilter(cbr, month == 3 & project_status ==
“Completed”) %>% {sum(.\(beneficiaries,
na.rm = TRUE)} %>% format(big.mark = ",")` were reached in
March 2023. `r `filter(cbr, month == 4 & project_status ==
"Completed") %>% {sum(.\)beneficiaries, na.rm =
TRUE)} %>% format(big.mark = “,”)` have been reached so far in April
2023.Changes in numbers of persons reached were due to cleaning and
verification of the dataset – this process is still ongoing and will
only be completed once the CWG fully transitions to 4W reporting.
1.1 Progress by date

The 6,160` beneficiaries reached earlier that 2023-02-09 all
pertained to the HRP, the only such beneficiaries reported so far.
3. Geographic breakdown of beneficiaries
Coverage continues to be highest in Afrin and Harim districts, which
have been worst-hit by the earthquake.

Casualties and damaged houses, absolute figures and per 100,000 personsgovernorate | district | wounded_dead1 | wounded_dead_100k1 | damaged_houses1 | damaged_houses_100k1 |
|---|
Aleppo | A'zaz | 356 | 57.87 | 276 | 44.86 |
Aleppo | Afrin | 2,232 | 478.79 | 2,910 | 624.22 |
Aleppo | Al Bab | 206 | 70.04 | 832 | 282.89 |
Aleppo | Jarablus | 40 | 33.82 | 257 | 217.30 |
Aleppo | Jebel Saman | 616 | 236.80 | 176 | 67.66 |
Idleb | Harim | 8,449 | 507.65 | 3,230 | 194.07 |
Idleb | Idleb | 350 | 48.23 | 946 | 130.37 |
Idleb | Jisr-Ash-Shugur | 595 | 183.68 | 1,915 | 591.18 |
1Data from the Assistance Coordination Unit, Syria 20230328; |
Below is a breakdown of beneficiaries based on whether they originate
from camps or villages:
More than twice as many beneficiaries from villages as from campsvillage_camps | beneficiaries | %_beneficiaries |
|---|
camp | 94,430 | 21.06 |
village | 228,690 | 51.01 |
NA | 125,197 | 27.93 |
3.1 By sub-district
The plots below show the breakdown of beneficiaries by sub-district.
Caution must be taken to ensure that allocations are fair across the
affected areas: there are numerous sub-districts where a very large
proportion of the total population has already been reached by
multi-purpose cash, in particular, Jandairis, Hairm, Salqin and
Sharan.
Response activities must be proportional with the magnitude and
severity of earthquake damage. Overallocation deprives affected persons
of the aid they are due.
The average percentage of the population reached, of all
sub-districts, is 10.63%.

3.2 Comparisons with PIN and earthquake damage
The plot below shows the total population of each sub-district on the
x-axis (for the moment, all persons in these areas are assumed to be
affected and are included in the PIN) and the number of beneficiaries on
the y-axis.
The size of each point indicates the number of dead or wounded
persons there per 100,000.

The higher or lower a sub-district is above the blue line, the more
disproportionate the number of beneficiaries allocated to that location
are.
This should also be compared to each sub-district’s share of the
earthquake damage. Of particular note, sub-districts in grey have yet to
receive any MPC assistance.

The CWG is currently working on a prioritisation score, which can be
a useful shorthand (or crutch), that will take into account pre-existing
vulnerability (likely from the MSNA) as well as earthquake impacts.
3.3 Planned activities

4. Cash response actors and cash disbursed
In the scatterplot below, each point is a single cash working group
partner. The x-axis indicates the number of beneficiaries reached per
agency and the y-axis indicates the number of communities (admin4)
reached.
USD 13.3 million has been distributed across 174 communities and 28
sub-districts in NW Syria.
The table below summarises the information in the scatterplot above
in tabular form:
Reach and footprint of cash response actorsimplementing_partner1 | beneficiaries | districts | communities |
|---|
CBRTWG-006 | 67,989 | 3 | 20 |
People in Need (PIN) | 36,144 | 3 | 25 |
GOAL (GOAL) | 34,310 | 3 | 70 |
CBRTWG-010 | 33,115 | 5 | 15 |
Norwegian Refugee Council (NRC) | 20,900 | 2 | 5 |
CBRTWG-035 | 14,197 | 5 | 27 |
Mercy Without Limits | 13,016 | 4 | 10 |
Bahar Organization (BO) | 12,000 | 1 | 1 |
Agency for Technical Cooperation and Development (ACTED) | 10,481 | 7 | 28 |
Uluslararasi Insani Yardimlasma Dernegi (IYD) | 10,351 | 4 | 16 |
Syria Relief | 9,750 | 5 | 7 |
Ihsan for Relief and Development | 8,655 | 5 | 16 |
World Vision International (WVI) | 7,008 | 1 | 4 |
Welthungerhilfe (WHH) | 4,830 | 4 | 4 |
Ataa Humanitarian Relief Association (ATAA) | 3,060 | 1 | 2 |
MASRRAT | 2,692 | 3 | 3 |
Elaf for relief and development | 1,750 | 1 | 1 |
NULLOnly partners who provided more than USD 100/family/month; |
4.1 USD disbursed per partner
USD disbursed and families reached by partnerimplementing_partner | total_usd | families | usd_per_fam | %_usd_total |
|---|
GOAL (GOAL) | 2,998,650 | 19,991 | 150.00 | 22.61 |
CBRTWG-006 | 1,773,750 | 11,825 | 150.00 | 13.38 |
CBRTWG-010 | 1,590,100 | 11,287 | 140.88 | 11.99 |
Norwegian Refugee Council (NRC) | 1,266,450 | 8,443 | 150.00 | 9.55 |
People in Need (PIN) | 927,450 | 6,183 | 150.00 | 6.99 |
Ihsan for Relief and Development | 854,250 | 5,695 | 150.00 | 6.44 |
Syria Relief | 724,500 | 4,830 | 150.00 | 5.46 |
Agency for Technical Cooperation and Development (ACTED) | 515,350 | 3,373 | 152.79 | 3.89 |
Mercy Without Limits | 438,372 | 3,325 | 131.84 | 3.31 |
CBRTWG-035 | 409,800 | 4,098 | 100.00 | 3.09 |
Uluslararasi Insani Yardimlasma Dernegi (IYD) | 375,000 | 2,500 | 150.00 | 2.83 |
Bahar Organization (BO) | 360,000 | 2,400 | 150.00 | 2.71 |
Welthungerhilfe (WHH) | 344,400 | 2,296 | 150.00 | 2.60 |
World Vision International (WVI) | 301,200 | 2,008 | 150.00 | 2.27 |
Ataa Humanitarian Relief Association (ATAA) | 177,000 | 1,180 | 150.00 | 1.33 |
Elaf for relief and development | 122,500 | 350 | 350.00 | 0.92 |
MASRRAT | 81,000 | 540 | 150.00 | 0.61 |
The CWG is currently working with other Clusters to consolidate all
cash-based activities and will soon be able to provide more
comprehensive reporting.
5 Annexes
5.1 Interactive reference table at sub-district level
Columns include: governorate, district,
sub-district, total population,
beneficiaries, total usd disbursed,
wounded and dead, wounded and dead per 100k,
damaged houses, damaged houses per 100k,
admin3pcode
5.2 Reporting quality
This section documents issues encountered in the cleaning of 4W and
FSL data and their impacts on the quality of reporting the CWG can
provide.
Note that substantial cleaning has already taken place and these
outstanding issues could not be resolved by the time of reporting.
However, the CWG recognises that not all reporting issues were due to
partner error. The CWG will work with partners to continue improving
reporting quality.
Still, one third of reporting originates from the FSL trackersource | partners | beneficiaries | %_beneficiaries |
|---|
4ws | 11 | 308,417 | 68.79 |
fsl_tracker | 7 | 139,900 | 31.21 |
January reporting is still largely incompletemonth | partners | beneficiaries | %_beneficiaries |
|---|
Jan | 2 | 3,778 | 0.84 |
Feb | 8 | 177,525 | 39.60 |
Mar | 10 | 200,330 | 44.68 |
Apr | 5 | 52,252 | 11.66 |
| 1 | 14,432 | 3.22 |
Activities pertaining to 14,432 were missing their date or had dates
in unreadable formats. However, the columns start date,
end date and month of reporting were some of
the most troublesome and consumed a large part of the time dedicated to
data cleaning.
The CWG would like to reiterate that start date and
end date should be entered in the format mm/dd/yyyy and
that month of reporting should be selected from the
dropdown menu.
12 partners have reported planned activitiesproject_status | partners | beneficiaries | %_beneficiaries |
|---|
Completed | 17 | 448,317 | 87.83 |
Planned | 12 | 62,129 | 12.17 |
Suspended | 1 | 0 | 0.00 |
The sum of planned beneficiaries is 62,129. If this is the extent of
all planned MPC activities, the CWG as a whole can expect to reach
around 77% of its target of 662,942 persons.
Below is a breakdown of planned actitivities by source:
Breakdown of planned activities by sourcesource | partners | beneficiaries | %_beneficiaries |
|---|
4ws | 7 | 40,542 | 65.25 |
fsl_tracker | 5 | 21,587 | 34.75 |
LS0tDQp0aXRsZTogIk5vcnRod2VzdCBTeXJpYSBDYXNoIFdvcmtpbmcgR3JvdXAgRWFydGhxdWFrZSBSZXNwb25zZSBCdWxsZXRpbiINCmRhdGU6ICAiNCBBcHJpbCAyMDIzIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogICAgY29sbGFwc2VkOiBubw0KYWx3YXlzX2FsbG93X2h0bWw6IHllcw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc3RyaW5naSkNCmxpYnJhcnkocGFuZGVyKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHNraW1yKQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShoZXJlKQ0KbGlicmFyeShzZikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShmbGV4dGFibGUpDQpsaWJyYXJ5KHNuYWtlY2FzZSkNCmxpYnJhcnkoYXJhYmljU3RlbVIpDQpsaWJyYXJ5KHdyaXRleGwpDQpsaWJyYXJ5KG1kZXByaXYpDQpsaWJyYXJ5KGdncmVwZWwpDQoNCnRoZW1lX3NldCh0aGVtZV9saWdodCgpKQ0KDQojIGRpc2FibGluZyBzY2llbnRpZmljIG5vdGF0aW9uDQpvcHRpb25zKHNjaXBlbiA9IDEwMCkNCg0KIyBwYW5kZXIgdGFibGVzIGFsbCBpbiBvbmUgcm93DQpwYW5kZXJPcHRpb25zKCd0YWJsZS5zcGxpdC50YWJsZScsIEluZikNCg0KIyBwYW5kZXIgdGhvdXNhbmRzIHNlcGFyYXRvcg0KcGFuZGVyT3B0aW9ucygiYmlnLm1hcmsiLCAiLCIpDQoNCiMgcmVwbGFjZSANCm9wdHMgPC0gb3B0aW9ucyhrbml0ci5rYWJsZS5OQSA9ICIiKQ0KDQpgJW91dCVgIDwtIE5lZ2F0ZShgJWluJWApDQoNCiMgZnVuY3Rpb24gZm9yIHRyYW5zcG9zaW5nIGRmDQp0cmFuc3Bvc2VfZGYgPC0gZnVuY3Rpb24oZGYpIHsNCiAgdF9kZiA8LSBkYXRhLnRhYmxlOjp0cmFuc3Bvc2UoZGYpDQogIGNvbG5hbWVzKHRfZGYpIDwtIHJvd25hbWVzKGRmKQ0KICByb3duYW1lcyh0X2RmKSA8LSBjb2xuYW1lcyhkZikNCiAgdF9kZiA8LSB0X2RmICU+JQ0KICAgIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKC5kYXRhID0gLikgJT4lDQogICAgdGliYmxlOjphc190aWJibGUoLikNCiAgcmV0dXJuKHRfZGYpDQp9DQoNCiMgZnVuY3Rpb24gYmVuZWZpY2lhcnkgc3VtbWFyaWVzDQpzdW1fYmVuIDwtIGZ1bmN0aW9uKGRmLCBjb2x1bW5fdmFyKXsNCiAgDQogIGNvbHVtbl92YXIgPC0gZW5xdW8oY29sdW1uX3ZhcikNCiAgDQogIGRmICU+JQ0KICAgIGdyb3VwX2J5KCEhY29sdW1uX3ZhcikgJT4lICMgbXVzdCBhZGQgYmFuZy1iYW5nDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpDQogICAgDQp9DQoNCiMgZnVuY3Rpb24gYmVuZWZpY2lhcnkgc3VtbWFyaWVzLCAyIGdyb3VwZWQgdmFyaWFibGVzDQpzdW1fYmVuMiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3ZhcjEsIGNvbHVtbl92YXIyKXsNCiAgDQogIGNvbHVtbl92YXIxIDwtIGVucXVvKGNvbHVtbl92YXIxKQ0KICBjb2x1bW5fdmFyMiA8LSBlbnF1byhjb2x1bW5fdmFyMikNCiAgDQogIGRmICU+JQ0KICAgIGdyb3VwX2J5KCEhY29sdW1uX3ZhcjEsICEhY29sdW1uX3ZhcjIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gImRyb3AiKQ0KICAgIA0KfQ0KDQojIHNjYWxpbmcgZnVuY3Rpb25zIA0KcmFuZ2UwMSA8LSBmdW5jdGlvbih4KXsoeC1taW4oeCkpLyhtYXgoeCktbWluKHgpKX0NCnJhbmdlX3duYSA8LSBmdW5jdGlvbih4KXsoeC1taW4oeCwgbmEucm0gPSBUUlVFKSkvKG1heCh4LCBuYS5ybSA9IFRSVUUpLW1pbih4LCBuYS5ybSA9IFRSVUUpKX0NCg0KI21vZGUgZnVuY3Rpb24gDQptb2RlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgdXggPC0gdW5pcXVlKHgpDQogIHV4W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh4LCB1eCkpKV0NCn0NCg0KbG9jYXRpb25zIDwtIHJlYWRfZXhjZWwoIi4vZGF0YS9Mb2NhdGlvbnMueGxzeCIpICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KDQpwY29kZTNfc2hhcGUgPC0gDQogIHN0X3JlYWQoIi4vZGF0YS9zeXJfYWRtYm5kYV91bmNzX3Vub2NoYV8yMDIwMTIxNy9zeXJfYWRtYm5kYV9hZG0zX3VuY3NfdW5vY2hhXzIwMjAxMjE3LnNocCIpDQoNCmFyYWJpY19sYWJlbHMgPC0gZnVuY3Rpb24oeCkgcGFzdGUwKCJcdTIwMmIiLCB4KQ0KDQpyZXBvcnRfZGF0ZSA8LSAiMTEgQXByaWwgMjAyMyINCmBgYA0KDQoNCmBgYHtyIGRhdGF9DQpuYW1lc19lcSA8LSBjKA0KICAiZGF0ZSIsDQogICJnb3Zlcm5vcmF0ZSIsDQogICJkaXN0cmljdCIsDQogICJzdWJfZGlzdHJpY3QiLA0KICAiY29tbXVuaXR5IiwNCiAgImFkbWluNCIsDQogICJjYXN1YWx0aWVzIiwNCiAgImluanVyaWVzIiwNCiAgImNvbXBsZXRlbHlfZGVzdHJveWVkX2hvdXNlcyIsDQogICJkYW1hZ2VkX3VuaWhhYml0YWJsZV9ob3VzZXMiLA0KICAidGVtcG9yYXJ5X2FjY29tbW9kYXRpb25fY2VudHJlcyIsDQogICJpZHBzX2luX2FsbF9jZW50cmVzIiwNCiAgInNjaG9vbHNfYXNfYWNjb21vZGF0aW9uX2NlbnRyZXMiLA0KICAiaWRwc19pbl9zY2hvb2xzIiwNCiAgInRlbnRzX25lZWRlZCIsDQogICJibGFua2V0c19tYXR0cmVzc2VzX25lZWRlZCIsDQogICJ0ZW1wb3JhcnlfYWNjb21tb2RhdGlvbl9jZW50cmVzX2F2YWlsYWJsZSIsIA0KICAiYWNjZXNzaWJsZV9jaXZpbF9kZWZlbnNlIiwNCiAgImxhdHJpbmVzX2F2YWlsYWJsZSIsDQogICJtZWFsc19uZWVkZWRfcGVyX2RheSIsDQogICJuZWVkX2Jsb29kX2RvbmF0aW9ucyIsDQogICJoZWFsdGhfc2VydmljZXNfYXZhaWxhYmxlIiwNCiAgIm5lY2Vzc2FyeV9tZWRpY2FsX2VxdWlwbWVudCIsDQogICJydWJibGVfdm9sdW50ZWVycyIsDQogICJ0ZWxlY29tc19hdmFpbGFibGUiLA0KICAiZWxlY3RyaWNpdHlfYXZhaWxhYmxlIiwgDQogICJoZWF0aW5nX2Z1ZWxfbmVlZGVkIg0KKQ0KDQplcSA8LSByZWFkX2V4Y2VsKCIuL2RhdGEvc3lyaWEtZWFydGhxdWFrZS1pbXBhY3QtMjAtbWFyY2gtMjAyMy54bHN4IiwNCiAgICAgICAgICAgICAgICAgc2hlZXQgPSAiREFUQVNFVCIpICU+JSANCiAgc2V0TmFtZXMobmFtZXNfZXEpICU+JSANCiAgbGVmdF9qb2luKGxvY2F0aW9ucyAlPiUgc2VsZWN0KGFkbWluNHBjb2RlLCBhZG1pbjNwY29kZSksIA0KICAgICAgICAgICAgYnkgPSBjKCJhZG1pbjQiID0gImFkbWluNHBjb2RlIikpICU+JSANCiAgbXV0YXRlKHdvdW5kZWRfZGVhZCA9IGNhc3VhbHRpZXMgKyBpbmp1cmllcywNCiAgICAgICAgICAgICBkYW1hZ2VkX2hvdXNlcyA9IGNvbXBsZXRlbHlfZGVzdHJveWVkX2hvdXNlcyArIGRhbWFnZWRfdW5paGFiaXRhYmxlX2hvdXNlcykgJT4lIA0KICAgICAgZ3JvdXBfYnkoYWRtaW4zcGNvZGUpICU+JSANCiAgICAgIHN1bW1hcmlzZSh3b3VuZGVkX2RlYWQgPSBzdW0od291bmRlZF9kZWFkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgICBkYW1hZ2VkX2hvdXNlcyA9IHN1bShkYW1hZ2VkX2hvdXNlcywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBsZWZ0X2pvaW4ocmVhZF9leGNlbCgiLi9kYXRhLzIwMjNITk9fUGlOX1NldmVyaXR5X2RldGFpbGVkQW9JX0ZPUlNIQVJFIDE1MDMyMDIzLnhsc3giLCBza2lwID0gMSwgDQogICAgICAgICAgICAgICAgICBzaGVldCA9IDEpICU+JQ0KICAgICAgICAgICAgICBjbGVhbl9uYW1lcygpICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYWRtaW4zcGNvZGUsIHRvdGFsX3BvcHVsYXRpb24pLCANCiAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lIA0KICBtdXRhdGUod291bmRlZF9kZWFkXzEwMGsgPSB3b3VuZGVkX2RlYWQgLyB0b3RhbF9wb3B1bGF0aW9uICogMTAwMDAwLCANCiAgICAgICAgIGRhbWFnZWRfaG91c2VzXzEwMGsgPSBkYW1hZ2VkX2hvdXNlcyAvIHRvdGFsX3BvcHVsYXRpb24gKiAxMDAwMDApDQoNCg0KZXFfbWRlcHJpdiA8LSBlcSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMod291bmRlZF9kZWFkLCBkYW1hZ2VkX2hvdXNlcywgDQogICAgICAgICAgICAgICAgIHdvdW5kZWRfZGVhZF8xMDBrLCBkYW1hZ2VkX2hvdXNlc18xMDBrKSwgfiByYW5nZV93bmEoLikpICU+JSANCiAgbWRlcHJpdihjKCJ3b3VuZGVkX2RlYWQiLCAiZGFtYWdlZF9ob3VzZXMiLCANCiAgICAgICAgICAgICJ3b3VuZGVkX2RlYWRfMTAwayIsICJkYW1hZ2VkX2hvdXNlc18xMDBrIiksIA0KICAgICAgICAgIG1ldGhvZCA9ICJjeiIsIG91dHB1dCA9ICJhbGwiLCANCiAgICAgICAgICBzY29yZV9pX2hlYWRpbmcgPSAiZXFfc2NvcmUiKQ0KDQplcSA8LSBlcSAlPiUgDQogIGxlZnRfam9pbihlcV9tZGVwcml2JGRhdGEgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYWRtaW4zcGNvZGUsIGVxX3Njb3JlKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpDQoNCiMgVGhpbmsgb2YgYW5vdGhlciB3YXkgdG8gZG8gdGhpcyAtLSBpZiBzb21lb25lIGVsc2UgcnVucyB0aGlzLCBpdCB3b24ndCB3b3JrIA0KY2JyIDwtIHJlYWRfY3N2KCIuL2RhdGEvY2JyX2NvbS5jc3YiKSAlPiUgDQogIG11dGF0ZShtb250aCA9IG1vbnRoKGRpc3RyaWJ1dGlvbl9kYXRlKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoYmVuZWZpY2lhcmllcyA9IDApKSANCiAgDQoNCmhubyA8LSByZWFkX2V4Y2VsKCIuL2RhdGEvMjAyM0hOT19QaU5fU2V2ZXJpdHlfZGV0YWlsZWRBb0lfRk9SU0hBUkUgMTUwMzIwMjMueGxzeCIsIHNraXAgPSAxLCANCiAgICAgICAgICAgICAgICAgIHNoZWV0ID0gMSkgJT4lDQogIGNsZWFuX25hbWVzKCkNCg0KDQpud19wY29kZTMgPC0gaG5vICU+JSANCiAgZmlsdGVyKGFvX2MgPT0gIk5XIikgJT4lIA0KICBwdWxsKGFkbWluM3Bjb2RlKQ0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMgMS4gTVBDIHJlc3BvbnNlIG92ZXJ2aWV3DQoNCkFzIG9mIDExIEFwcmlsIDIwMjMsIGEgdG90YWwgb2YgYHIgY2JyICU+JSBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcyl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIG9yIGByIGNiciAlPiUgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGZhbWlsaWVzKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGZhbWlsaWVzIGhhdmUgYmVlbiByZWFjaGVkIGJ5IE1QQyBpbnRlcnZlbnRpb25zLiANCkEgdG90YWwgb2YgVVNEIGByIHBhc3RlKGZvcm1hdChyb3VuZCgoY2JyICU+JSBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSAge3N1bSguJHRvdGFsX3VzZCl9KSAvIDEwMDAwMDAsIDEpLCB0cmltID0gVFJVRSksICJtaWxsaW9uIilgIGhhcyBiZWVuIGRpc2J1cnNlZCBieSBgciBjYnIgJT4lIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHN1bW1hcmlzZShuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSkgJT4lIHB1bGwoKWAgaW1wbGVtZW50aW5nIGFnZW5jaWVzIGFjcm9zcyBgciBjYnIgJT4lIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHN1bW1hcmlzZShuX2Rpc3RpbmN0KGFkbWluM3Bjb2RlKSkgJT4lIHB1bGwoKWAgc3ViLWRpc3RyaWN0cy4gDQoNCldpdGggb25seSBjZXJ0YWluIGV4Y2VwdGlvbnMgKHN1Y2ggYXMgYWN0aXZpdGllcyBzcGVjaWZpZWQgYXMgbm9uLU1QQyBjYXNoLWZvci1mb29kKSwgb25seSBiZW5lZmljaWFyaWVzIHdobyBoYXZlIHJlY2VpdmVkIGF0IGxlYXN0IFVTRCAxMDAvZmFtaWx5L21vbnRoIGhhdmUgYmVlbiBpbmNsdWRlZC4NCg0KPGJyPg0KDQpgYGB7ciBzdW1tYXJ5IHRhYmxlfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUNCiAgZ3JvdXBfYnkoZ292ZXJub3JhdGUsIGRpc3RyaWN0KSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgICAgICAgIGNvbW11bml0aWVzID0gbl9kaXN0aW5jdChhZG1pbjRwY29kZSksIA0KICAgICAgICAgICAgaG91c2Vob2xkcyA9IHN1bShmYW1pbGllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgdG90YWxfdXNkID0gc3VtKHRvdGFsX3VzZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoYCVfYmVuZWZpY2lhcmllc2AgPSANCiAgICAgICAgICAgcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lDQogIGFkb3JuX3RvdGFscygicm93IiwsLCwgaG91c2Vob2xkcywgYmVuZWZpY2lhcmllcywgdG90YWxfdXNkLCBgJV9iZW5lZmljaWFyaWVzYCkgJT4lIA0KICBtdXRhdGUoYCVfYmVuZWZpY2lhcmllc2AgPSBpZmVsc2UoYCVfYmVuZWZpY2lhcmllc2AgPiA5OS45OCwgMTAwLCBgJV9iZW5lZmljaWFyaWVzYCkpICU+JSANCiAgc2VsZWN0KGdvdmVybm9yYXRlLCBkaXN0cmljdCwgY29tbXVuaXRpZXMsIHBhcnRuZXJzLCANCiAgICAgICAgIGhvdXNlaG9sZHMsIGJlbmVmaWNpYXJpZXMsIHRvdGFsX3VzZCwgYCVfYmVuZWZpY2lhcmllc2ApICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIjQ0OCwwMDAgcGVvcGxlIHJlYWNoZWQgd2l0aCBNUEMsIFVTRCAxMy4zIG1pbGxpb24gZGlzYnVyc2VkLCAiLCByZXBvcnRfZGF0ZSkpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQojICBmb290bm90ZShpID0gMSwgaiA9IDYsIHBhcnQgPSAiaGVhZGVyIiwgcmVmX3N5bWJvbHMgPSAiYSIsDQojICAgICAgICAgICBhc19wYXJhZ3JhcGgoIkJlbmVmaWNpYXJ5IGZpZ3VyZXMgaW5jbHVkZSBvbmx5IHJlcG9ydGVkIE1QQyB3aXRoIGEgbWluaW11bSB0cmFuc2ZlciB2YWx1ZSAjb2YgVVNEIDEwMCIpKSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gOCwgcGFydCA9ICJoZWFkZXIiLCByZWZfc3ltYm9scyA9ICJiIiwgaW5saW5lID0gVFJVRSwgIA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIkFzIHBlcmNlbnRhZ2Ugb2YgYWxsIE1QQyBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gTlcgU3lyaWEiKSkgDQoNCg0KYGBgDQoNCg0KYGBge3IgZXZhbCA9IEZBTFNFfQ0KDQojIEp1c3QgYnJlYWtkb3duIGJ5IG1vbnRoIC0tIGRvbid0IGtub3cgd2h5IEkgZGlkIGEgbGluZSBwbG90IGluc3RlYWQgb2YgYSBiYXJwbG90LCANCiMgbWF5YmUgYmFycGxvdCB3aGVuIHRoZXJlIGFyZSBtb3JlIG1vbnRocyANCg0KY2JyICU+JSANCiAgbXV0YXRlKG1vbnRoID0gbW9udGgoZGlzdHJpYnV0aW9uX2RhdGUpKSAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICANCiAgZ3JvdXBfYnkobW9udGgpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSkNCg0KY2JyICU+JSBjb3VudChpbXBsZW1lbnRpbmdfcGFydG5lciwgcGFydG5lcl9jb2RlKQ0KDQpgZmlsdGVyKGNiciwgbW9udGggPT0gMiAmIHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYA0KDQpgYGANCg0KPGJyPg0KDQpgciBmaWx0ZXIoY2JyLCBtb250aCA9PSAyICYgcHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGJlbmVmaWNpYXJpZXMgd2VyZSByZWFjaGVkIGluIEZlYnJ1YXJ5IDIwMjMgYW5kIGByIGBmaWx0ZXIoY2JyLCBtb250aCA9PSAzICYgcHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgcmVhY2hlZCBpbiBNYXJjaCAyMDIzLiBgciBgZmlsdGVyKGNiciwgbW9udGggPT0gNCAmIHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBoYXZlIGJlZW4gcmVhY2hlZCBzbyBmYXIgaW4gQXByaWwgMjAyMy5DaGFuZ2VzIGluIG51bWJlcnMgb2YgcGVyc29ucyByZWFjaGVkIHdlcmUgZHVlIHRvIGNsZWFuaW5nIGFuZCB2ZXJpZmljYXRpb24gb2YgdGhlIGRhdGFzZXQgLS0gdGhpcyBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgYW5kIHdpbGwgb25seSBiZSBjb21wbGV0ZWQgb25jZSB0aGUgQ1dHIGZ1bGx5IHRyYW5zaXRpb25zIHRvIDRXIHJlcG9ydGluZy4gDQoNCiAgDQogIA0KDQpgYGB7ciBldmFsPUZBTFNFfQ0KY2JyICU+JSANCiAgbXV0YXRlKGRpc3RyaWJ1dGlvbl9kYXRlID0gYXMuRGF0ZShkaXN0cmlidXRpb25fZGF0ZSkpICU+JSANCiAgZmlsdGVyKGRpc3RyaWJ1dGlvbl9kYXRlID09ICIwMDIyLTAxLTIwIikgJT4lIA0KICB7c3VtKC4kYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0NCmBgYA0KDQo8YnI+PGJyPg0KDQojIyAxLjEgUHJvZ3Jlc3MgYnkgZGF0ZQ0KDQpgYGB7cn0NCmNiciAlPiUNCiAgbXV0YXRlKGRpc3RyaWJ1dGlvbl9kYXRlID0gYXMuRGF0ZShkaXN0cmlidXRpb25fZGF0ZSkpICU+JSANCiAgZmlsdGVyKCFpcy5uYShkaXN0cmlidXRpb25fZGF0ZSkpICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KGRpc3RyaWJ1dGlvbl9kYXRlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUNCiAgYXJyYW5nZShkaXN0cmlidXRpb25fZGF0ZSkgJT4lIA0KICBmaWx0ZXIoZGlzdHJpYnV0aW9uX2RhdGUgIT0gIjAwMjItMDEtMjAiKSAlPiUgDQogIG11dGF0ZShpZmVsc2UoZGlzdHJpYnV0aW9uX2RhdGUgPiAiMjAyMy0wNC0xMSIsICIyMDIzLTA0LTExIiwgZGlzdHJpYnV0aW9uX2RhdGUpKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShjdW1fbGFiZWwgPSBpZmVsc2UoZGlzdHJpYnV0aW9uX2RhdGUgPT0gIjIwMjMtMDItMDkiIHwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25fZGF0ZSA9PSAiMjAyMy0wMy0wMiIgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRpc3RyaWJ1dGlvbl9kYXRlID09ICIyMDIzLTAzLTIyIiB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25fZGF0ZSA9PSAiMjAyMy0wMy0zMCJ8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25fZGF0ZSA9PSAiMjAyMy0wNC0xNSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bV9iZW4sICIiKSwgDQogICAgICAgICBjdW1fbGFiZWwgPSBhcy5udW1lcmljKGN1bV9sYWJlbCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBkaXN0cmlidXRpb25fZGF0ZSwgeSA9IGN1bV9iZW4pKSArIA0KICBnZW9tX2xpbmUoY29sb3VyID0gImJsdWUiKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpjb21tYShjdW1fbGFiZWwpKSwgdmp1c3QgPSAtLjYsIA0KICAgICAgICAgICAgc2l6ZSA9IDQpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIHdlZWsiLCBkYXRlX2xhYmVscyA9ICIlZC0lYiIpICsNCiAgIyBXaHkgZGlkbid0IHlvdSBsZWFybiB0aGlzIGJlZm9yZT8gDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSAuMSkpICsgDQogIGxhYnMoeCA9ICJEaXN0cmlidXRpb24gZGF0ZSIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTVBDIHByb2dyZXNzIGJ5IGRhdGUiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUaGUgZWFybGllc3QgZWFydGhxdWFrZS1yZWxhdGVkIGRpc3RyaWJ1dGlvbiB3YXMgMjAyMy0wMi0wOVxuRXhjbHVkZXMgMTYsNDYwIGJlbmVmaWNpYXJpZXMgZm9yIHdoaWNoIHRoZSBkYXRlIHdhcyBub3QgcmVwb3J0ZWQgb3Igd2FzIHVucmVhZGFibGUiKSAgDQogIA0KIyBnZ3NhdmUoIi4vaW1nL3Byb2dyZXNzX2xpbmUucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSA4LjI3LCB3aWR0aCA9IDExLjY5LCB1bml0cyA9ICJpbiIpICANCmBgYA0KDQo8YnI+DQoNClRoZSBgciBmb3JtYXQoZmlsdGVyKGNiciwgcmVzcG9uc2VfdHlwZSA9PSAiSFJQIiAmIHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9LCBiaWcubWFyayA9ICIsIilgYCBiZW5lZmljaWFyaWVzIHJlYWNoZWQgZWFybGllciB0aGF0IDIwMjMtMDItMDkgYWxsIHBlcnRhaW5lZCB0byB0aGUgSFJQLCB0aGUgb25seSBzdWNoIGJlbmVmaWNpYXJpZXMgcmVwb3J0ZWQgc28gZmFyLiANCg0KPGJyPjxicj4NCg0KIyAyLiBNYXAgb2YgYWN0aXZpdGllcw0KDQo8YnI+DQoNCmBgYHtyfQ0KDQpwbGFubmVkX2ltcGxlbWVudGVkX21hcCA8LSBjYnIgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgDQogICAgICAgICAgICAgYnkgPSBjKCJhZG1pbjNwY29kZSIgPSAiQURNM19QQ09ERSIpKSAlPiUgDQogIGZpbHRlcihBRE0xX1BDT0RFICVpbiUgYygiU1kwMiIsICJTWTA3IikgJiAhaXMubmEoYmVuZWZpY2lhcmllcykpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUNCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjEsIGNvbG91ciA9ICJncmV5NzAiKSArIA0KICBnZW9tX3BvaW50KGFlcyhzaXplID0gYmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgICAgICAgY29sb3VyID0gcHJvamVjdF9zdGF0dXMsIA0KICAgICAgICAgICAgICAgICB4ID0gbG9uZ2l0dWRlX3gsIHkgPSBsYXRpdHVkZV95LCANCiAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCgic3ViX2Rpc3RyaWN0OiAiLCBzdWJfZGlzdHJpY3QsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW11bml0eTogIiwgY29tbXVuaXR5LCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhdGlvbl90eXBlOiAiLCB2aWxsYWdlX2NhbXBzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiIsIGZvcm1hdChiZW5lZmljaWFyaWVzLCBiaWcubWFyayA9ICIsIiksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRuZXI6ICIsIGFiYnJldmlhdGlvbiwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvbl94OiAiLCBsb25naXR1ZGVfeCwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF0X3k6ICIsIGxhdGl0dWRlX3kpKSwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgc3Ryb2tlID0gLjM1LCANCiAgICAgICAgICAgICBhbHBoYSA9IC41KSArIA0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQogIHNjYWxlX2NvbG91cl92aXJpZGlzX2QobmEudHJhbnNsYXRlID0gRkFMU0UpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9IE5BKSwgDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksKSArDQogIGxhYnModGl0bGUgPSAiQ29tbXVuaXRpZXMgcmVhY2hlZCBhbmQgcGxhbm5lZCAtLSBDV0cgcGFydG5lcnMiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJQbGFubmVkIGluIHllbGxvdywgY29tcGxldGVkIGluIHB1cnBsZSwgc2l6ZSBzaG93cyBudW1iZXIgb2YgcGVyc29ucyIsIA0KICAgICAgIGNvbG91ciA9ICJTdGF0dXMiKSArDQogIGd1aWRlcyhzaXplID0gIm5vbmUiKQ0KDQogIA0KZ2dwbG90bHkocGxhbm5lZF9pbXBsZW1lbnRlZF9tYXAsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpICU+JSANCiAgcGxvdGx5OjpzdHlsZShob3Zlcm9uID0gInBvaW50IikgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkNvbW11bml0aWVzIHJlYWNoZWQgYW5kIHBsYW5uZWQgLS0gQ1dHIHBhcnRuZXJzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxhbm5lZCBpbiB5ZWxsb3csIGNvbXBsZXRlZCBpbiBwdXJwbGUsIHNpemUgc2hvd3MgbnVtYmVyIG9mIHBlcnNvbnM7IGNsaWNrIGFuZCBkcmFnIHRvIHpvb207IG1vdXNlIG92ZXIgZm9yIGRldGFpbHMiKSkpDQogIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIDMuIEdlb2dyYXBoaWMgYnJlYWtkb3duIG9mIGJlbmVmaWNpYXJpZXMgDQoNCkNvdmVyYWdlIGNvbnRpbnVlcyB0byBiZSBoaWdoZXN0IGluIEFmcmluIGFuZCBIYXJpbSBkaXN0cmljdHMsIHdoaWNoIGhhdmUgYmVlbiB3b3JzdC1oaXQgYnkgdGhlIGVhcnRocXVha2UuIA0KDQo8YnI+DQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBkaXN0cmljdCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShkaXN0cmljdCA9IGZjdF9yZW9yZGVyKGRpc3RyaWN0LCBiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICBnb3Zlcm5vcmF0ZSA9IGZjdF9yZWxldmVsKGdvdmVybm9yYXRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiSWRsZWIiLCAiQWxlcHBvIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBkaXN0cmljdCkpICsgDQogIGdlb21fY29sKGFlcyhmaWxsID0gZ292ZXJub3JhdGUpKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGJlZ2luID0gLjMpICsgDQogIGxhYnModGl0bGUgPSAiTVBDIGJlbmVmaWNpYXJpZXMgYnkgZGlzdHJpY3QiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJhcyBvZiAxMSBBcHJpbCAyMDIzIiwgDQogICAgICAgeSA9ICIiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQoNCmhubyAlPiUgDQogIGZpbHRlcihhZG1pbjJuYW1lX2VuICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlID0gYWRtaW4xbmFtZV9lbiwgZGlzdHJpY3QgPSBhZG1pbjJuYW1lX2VuKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9wb3B1bGF0aW9uID0gc3VtKHRvdGFsX3BvcHVsYXRpb24sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBsZWZ0X2pvaW4oDQogICAgY2JyICU+JQ0KICAgICAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgIA0KICAgICAgZ3JvdXBfYnkoZGlzdHJpY3QpICU+JSANCiAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICwgIA0KICBieSA9ICJkaXN0cmljdCIpICU+JSANCiAgbXV0YXRlKGRpc3RyaWN0ID0gZmN0X3JlbGV2ZWwoZGlzdHJpY3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWwgQmFiIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKYXJhYmx1cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQSd6YXoiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkplYmVsIFNhbWFuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmlzci1Bc2gtU2h1Z3VyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZGxlYiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGFyaW0iKSwNCiAgICAgICAgIHBjX3JlYWNoZWQgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gdG90YWxfcG9wdWxhdGlvbiAqIDEwMCwgZGlnaXRzID0gMSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGNfcmVhY2hlZCwgeSA9IGRpc3RyaWN0KSkgKw0KICBnZW9tX2NvbChhZXMoZmlsbCA9IGdvdmVybm9yYXRlKSkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHBjX3JlYWNoZWQpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGJlZ2luID0gLjMpICsgDQogIGxhYnModGl0bGUgPSAiUGVyY2VudCBvZiBwb3B1bGF0aW9uIHJlYWNoZWQiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJhcyBvZiAxMSBBcHJpbCAyMDIzIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB4ID0gIiUgb2YgcG9wdWxhdGlvbiByZWFjaGVkIikgKw0KICANCiAgcGxvdF9sYXlvdXQoZ3VpZGVzID0gImNvbGxlY3QiKSAmIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCg0KZ2dzYXZlKCIuL2ltZy9tcGNfYnlfZGlzdHJpY3QucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSA4LjI3LCB3aWR0aCA9IDExLjY5LCB1bml0cyA9ICJpbiIpICANCg0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQplcSAlPiUgDQogIGxlZnRfam9pbihobm8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoZ292ZXJub3JhdGUgPSBhZG1pbjFuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWN0ID0gYWRtaW4ybmFtZV9lbiwgDQogICAgICAgICAgICAgICAgICAgICBzdWJfZGlzdHJpY3QgPSBhZG1pbjNuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGFkbWluM3Bjb2RlKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JSANCiAgZmlsdGVyKGFkbWluM3Bjb2RlICVpbiUgbndfcGNvZGUzICYgDQogICAgICAgICAgIGRpc3RyaWN0ICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsICJKZWJlbCBTYW1hbiIsICJBJ3pheiIsICJKYXJhYmx1cyIsICJBbCBCYWIiKSkgJT4lIA0KICBncm91cF9ieShnb3Zlcm5vcmF0ZSwgZGlzdHJpY3QpICU+JSANCiAgc3VtbWFyaXNlKHdvdW5kZWRfZGVhZCA9IHN1bSh3b3VuZGVkX2RlYWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgZGFtYWdlZF9ob3VzZXMgPSBzdW0oZGFtYWdlZF9ob3VzZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgIyBXaGVyZSBpcyBBcmloYSwgYW5kIHdoeSBpcyBpdCBzaG93aW5nIHVwIGhlcmUNCiAgZmlsdGVyKGRpc3RyaWN0ICE9ICJBcmloYSIpICU+JSANCiAgbGVmdF9qb2luKGhubyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihhZG1pbjNwY29kZSAlaW4lIG53X3Bjb2RlMyAmDQogICAgICAgICAgICAgICAgICAgICAgIGFkbWluMm5hbWVfZW4gJWluJSBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoZGlzdHJpY3QgPSBhZG1pbjJuYW1lX2VuKSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSksIGJ5ID0gImRpc3RyaWN0IikgJT4lIA0KICBtdXRhdGUod291bmRlZF9kZWFkXzEwMGsgPSByb3VuZCh3b3VuZGVkX2RlYWQgLyBwb3B1bGF0aW9uICogMTAwMDAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBkYW1hZ2VkX2hvdXNlc18xMDBrID0gcm91bmQoZGFtYWdlZF9ob3VzZXMgLyBwb3B1bGF0aW9uICogMTAwMDAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBzZWxlY3QoZ292ZXJub3JhdGUsIGRpc3RyaWN0LCB3b3VuZGVkX2RlYWQsIHdvdW5kZWRfZGVhZF8xMDBrLCANCiAgICAgICAgIGRhbWFnZWRfaG91c2VzLCBkYW1hZ2VkX2hvdXNlc18xMDBrKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpICU+JSANCiAgc2V0X2NhcHRpb24oIkNhc3VhbHRpZXMgYW5kIGRhbWFnZWQgaG91c2VzLCBhYnNvbHV0ZSBmaWd1cmVzIGFuZCBwZXIgMTAwLDAwMCBwZXJzb25zIikgJT4lIA0KICBmb290bm90ZShwYXJ0ID0gImhlYWRlciIsIGkgPSAxLCBqID0gMzo2LCBpbmxpbmUgPSBUUlVFLCByZWZfc3ltYm9scyA9ICIxIiwNCiAgICAgICAgICAgdmFsdWUgPSBhc19wYXJhZ3JhcGgoIkRhdGEgZnJvbSB0aGUgQXNzaXN0YW5jZSBDb29yZGluYXRpb24gVW5pdCwgU3lyaWEgMjAyMzAzMjgiKSkNCmBgYA0KDQogIA0KICANCg0KQmVsb3cgaXMgYSBicmVha2Rvd24gb2YgYmVuZWZpY2lhcmllcyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgb3JpZ2luYXRlIGZyb20gY2FtcHMgb3IgdmlsbGFnZXM6IA0KDQogIA0KICANCg0KYGBge3J9DQpjYnIgJT4lIA0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkodmlsbGFnZV9jYW1wcykgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QodmlsbGFnZV9jYW1wcyA9ICJOQSIpKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIk1vcmUgdGhhbiB0d2ljZSBhcyBtYW55IGJlbmVmaWNpYXJpZXMgZnJvbSB2aWxsYWdlcyBhcyBmcm9tIGNhbXBzIikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JQ0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjYpDQogIA0KYGBgDQoNCg0KICANCiAgICANCiAgICANCg0KIyMjIDMuMSBCeSBzdWItZGlzdHJpY3QNCg0KVGhlIHBsb3RzIGJlbG93IHNob3cgdGhlIGJyZWFrZG93biBvZiBiZW5lZmljaWFyaWVzIGJ5IHN1Yi1kaXN0cmljdC4gQ2F1dGlvbiBtdXN0IGJlIHRha2VuIHRvIGVuc3VyZSB0aGF0IGFsbG9jYXRpb25zIGFyZSBmYWlyIGFjcm9zcyB0aGUgYWZmZWN0ZWQgYXJlYXM6IHRoZXJlIGFyZSBudW1lcm91cyBzdWItZGlzdHJpY3RzIHdoZXJlIGEgdmVyeSBsYXJnZSBwcm9wb3J0aW9uIG9mIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVhY2hlZCBieSBtdWx0aS1wdXJwb3NlIGNhc2gsIGluIHBhcnRpY3VsYXIsIEphbmRhaXJpcywgSGFpcm0sIFNhbHFpbiBhbmQgU2hhcmFuLiANCg0KUmVzcG9uc2UgYWN0aXZpdGllcyBtdXN0IGJlIHByb3BvcnRpb25hbCB3aXRoIHRoZSBtYWduaXR1ZGUgYW5kIHNldmVyaXR5IG9mIGVhcnRocXVha2UgZGFtYWdlLiBPdmVyYWxsb2NhdGlvbiBkZXByaXZlcyBhZmZlY3RlZCBwZXJzb25zIG9mIHRoZSBhaWQgdGhleSBhcmUgZHVlLiANCg0KVGhlIGF2ZXJhZ2UgcGVyY2VudGFnZSBvZiB0aGUgcG9wdWxhdGlvbiByZWFjaGVkLCBvZiBhbGwgc3ViLWRpc3RyaWN0cywgaXMgMTAuNjMlLiANCg0KPGJyPg0KDQpgYGB7cn0NCmNiciAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBtdXRhdGUoc3ViX2Rpc3RyaWN0ID0gcmVjb2RlKHN1Yl9kaXN0cmljdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbHFpbiIgPSAiU2FscWluIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmcmluIiA9ICJBZnJpbiIpKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBzdWJfZGlzdHJpY3QpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShzdWJfZGlzdHJpY3QgPSBmY3RfcmVvcmRlcihzdWJfZGlzdHJpY3QsIGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBzdWJfZGlzdHJpY3QpKSArIA0KICBnZW9tX2NvbChhZXMoZmlsbCA9IGdvdmVybm9yYXRlKSkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChiZWdpbiA9IC4zKSArIA0KICBsYWJzKHRpdGxlID0gIk1QQyBiZW5lZmljaWFyaWVzIGJ5IGRpc3RyaWN0IiwgDQogICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoImFzIG9mICIsIHJlcG9ydF9kYXRlKSwgDQogICAgICAgeSA9ICIiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQoNCmhubyAlPiUgDQogIGZpbHRlcihhZG1pbjJuYW1lX2VuICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlID0gYWRtaW4xbmFtZV9lbiwgYWRtaW4zcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX3BvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgbGVmdF9qb2luKA0KICAgIGNiciAlPiUNCiAgICAgICBtdXRhdGUoc3ViX2Rpc3RyaWN0ID0gcmVjb2RlKHN1Yl9kaXN0cmljdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbHFpbiIgPSAiU2FscWluIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmcmluIiA9ICJBZnJpbiIpKSAlPiUgDQogICAgICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSAgDQogICAgICBncm91cF9ieShzdWJfZGlzdHJpY3QsIGFkbWluM3Bjb2RlKSAlPiUgDQogICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpLCANCiAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHN1Yl9kaXN0cmljdCkpICU+JSANCiAgbXV0YXRlKHN1Yl9kaXN0cmljdCA9IGZjdF9yZW9yZGVyKHN1Yl9kaXN0cmljdCwgYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKHBjX3JlYWNoZWQgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gdG90YWxfcG9wdWxhdGlvbiAqIDEwMCwgZGlnaXRzID0gMSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGNfcmVhY2hlZCwgeSA9IHN1Yl9kaXN0cmljdCkpICsNCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSBnb3Zlcm5vcmF0ZSkpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShwY19yZWFjaGVkKSksIA0KICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChiZWdpbiA9IC4zKSArIA0KICBsYWJzKHRpdGxlID0gIlBlcmNlbnQgb2YgcG9wdWxhdGlvbiByZWFjaGVkIiwgDQogICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoImFzIG9mICIsIHJlcG9ydF9kYXRlKSwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB4ID0gIiUgb2YgcG9wdWxhdGlvbiByZWFjaGVkIikgKw0KICANCiAgcGxvdF9sYXlvdXQoZ3VpZGVzID0gImNvbGxlY3QiKSAmIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCg0KZ2dzYXZlKCIuL2ltZy9tcGNfYnlfc3ViX2Rpc3RyaWN0LnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gOC4yNywgd2lkdGggPSAxMS42OSwgdW5pdHMgPSAiaW4iKSAgDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDMuMiBDb21wYXJpc29ucyB3aXRoIFBJTiBhbmQgZWFydGhxdWFrZSBkYW1hZ2UNCg0KVGhlIHBsb3QgYmVsb3cgc2hvd3MgdGhlIHRvdGFsIHBvcHVsYXRpb24gb2YgZWFjaCBzdWItZGlzdHJpY3Qgb24gdGhlIHgtYXhpcyAoZm9yIHRoZSBtb21lbnQsIGFsbCBwZXJzb25zIGluIHRoZXNlIGFyZWFzIGFyZSBhc3N1bWVkIHRvIGJlIGFmZmVjdGVkIGFuZCBhcmUgaW5jbHVkZWQgaW4gdGhlIFBJTikgYW5kIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyBvbiB0aGUgeS1heGlzLiANCg0KVGhlIHNpemUgb2YgZWFjaCBwb2ludCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBkZWFkIG9yIHdvdW5kZWQgcGVyc29ucyB0aGVyZSBwZXIgMTAwLDAwMC4gDQoNCjxicj4NCg0KYGBge3J9DQplcSAlPiUgDQogIGxlZnRfam9pbihobm8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoZ292ZXJub3JhdGUgPSBhZG1pbjFuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWN0ID0gYWRtaW4ybmFtZV9lbiwgDQogICAgICAgICAgICAgICAgICAgICBzdWJfZGlzdHJpY3QgPSBhZG1pbjNuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGFkbWluM3Bjb2RlKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JQ0KICBmaWx0ZXIoYWRtaW4zcGNvZGUgJWluJSBud19wY29kZTMgJiANCiAgICAgICAgICAgZGlzdHJpY3QgJWluJSBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBkaXN0cmljdCwgc3ViX2Rpc3RyaWN0LCBhZG1pbjNwY29kZSkgJT4lIA0KICBzdW1tYXJpc2Uod291bmRlZF9kZWFkID0gc3VtKHdvdW5kZWRfZGVhZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBkYW1hZ2VkX2hvdXNlcyA9IHN1bShkYW1hZ2VkX2hvdXNlcywgbmEucm0gPSBUUlVFKSkgJT4lDQogIGxlZnRfam9pbihobm8gJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoYWRtaW4zcGNvZGUgJWluJSBud19wY29kZTMgJg0KICAgICAgICAgICAgICAgICAgICAgICBhZG1pbjJuYW1lX2VuICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsICJKZWJlbCBTYW1hbiIsICJBJ3pheiIsICJKYXJhYmx1cyIsICJBbCBCYWIiKSkgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM3Bjb2RlKSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSksIA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUgDQogIG11dGF0ZSh3b3VuZGVkX2RlYWRfMTAwayA9IHJvdW5kKHdvdW5kZWRfZGVhZCAvIHBvcHVsYXRpb24gKiAxMDAwMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIGRhbWFnZWRfaG91c2VzXzEwMGsgPSByb3VuZChkYW1hZ2VkX2hvdXNlcyAvIHBvcHVsYXRpb24gKiAxMDAwMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogICAgbGVmdF9qb2luKGNiciAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSwgDQogICAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwb3B1bGF0aW9uLCB5ID0gYmVuZWZpY2lhcmllcykpICsgDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSB3b3VuZGVkX2RlYWRfMTAwaykpICsgDQogIGdlb21fdGV4dF9yZXBlbChhZXMobGFiZWwgPSBzdWJfZGlzdHJpY3QpLA0KICAgICAgICAgICAgICAgICAgIHBvaW50LnBhZGRpbmcgPSAuNSwgDQogICAgICAgICAgICAgICAgICAgc2VnbWVudC5jb2xvciA9ICJncmV5NTAiLCBzaXplID0gMykgKw0KICBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IGMoMCwgMzAwMCwgMTAwMDAsIDMwMDAwLCAxMDAwMDAsIDMwMDAwMCwgMTAwMDAwMCksIA0KICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hKSArIA0KICBzY2FsZV95X2xvZzEwKGJyZWFrcyA9IGMoMCwgMTAwMCwgMzAwMCwgMTAwMDAsIDMwMDAwLCAxMDAwMDApLA0KICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hKSArIA0KICBzY2FsZV9zaXplKGJyZWFrcyA9IGMoMCwgMTAwLCA1MDAsIDEwMDAsIDMwMDApKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG91ciA9ICJibHVlIiwgc2l6ZSA9IC41KSArDQogIGxhYnModGl0bGUgPSAiUG9wdWxhdGlvbiBhbmQgTVBDIGJlbmVmaWNpYXJpZXMgYnkgc3ViLWRpc3RyaWN0IiwNCiAgICAgICBzdWJ0aXRsZSA9ICJTaXplIGluZGljYXRlcyBkZWFkL3dvdW5kZWQgcGVyIDEwMCwwMDAwIiwgDQogICAgICAgeCA9ICJQb3B1bGF0aW9uIiwgDQogICAgICAgeSA9ICJCZW5lZmljaWFyaWVzIiwgDQogICAgICAgc2l6ZSA9ICJEZWFkL3dvdW5kZWRcbnBlciAxMDBrIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIGZyb20gQ1dHLCBGU0wgYW5kIEFDVSIpICsNCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpKSANCiAgDQogDQpgYGANCg0KPGJyPiANCg0KVGhlIGhpZ2hlciBvciBsb3dlciBhIHN1Yi1kaXN0cmljdCBpcyBhYm92ZSB0aGUgYmx1ZSBsaW5lLCB0aGUgbW9yZSBkaXNwcm9wb3J0aW9uYXRlIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyBhbGxvY2F0ZWQgdG8gdGhhdCBsb2NhdGlvbiBhcmUuIA0KDQpUaGlzIHNob3VsZCBhbHNvIGJlIGNvbXBhcmVkIHRvIGVhY2ggc3ViLWRpc3RyaWN0J3Mgc2hhcmUgb2YgdGhlIGVhcnRocXVha2UgZGFtYWdlLiBPZiBwYXJ0aWN1bGFyIG5vdGUsIHN1Yi1kaXN0cmljdHMgaW4gZ3JleSBoYXZlIHlldCB0byByZWNlaXZlIGFueSBNUEMgYXNzaXN0YW5jZS4gDQoNCjxicj4NCg0KYGBge3J9DQplcSAlPiUgDQogIGxlZnRfam9pbihobm8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoZ292ZXJub3JhdGUgPSBhZG1pbjFuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWN0ID0gYWRtaW4ybmFtZV9lbiwgDQogICAgICAgICAgICAgICAgICAgICBzdWJfZGlzdHJpY3QgPSBhZG1pbjNuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGFkbWluM3Bjb2RlKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JQ0KICBmaWx0ZXIoYWRtaW4zcGNvZGUgJWluJSBud19wY29kZTMgJiANCiAgICAgICAgICAgZGlzdHJpY3QgJWluJSBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBkaXN0cmljdCwgc3ViX2Rpc3RyaWN0LCBhZG1pbjNwY29kZSkgJT4lIA0KICBzdW1tYXJpc2Uod291bmRlZF9kZWFkID0gc3VtKHdvdW5kZWRfZGVhZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBkYW1hZ2VkX2hvdXNlcyA9IHN1bShkYW1hZ2VkX2hvdXNlcywgbmEucm0gPSBUUlVFKSkgJT4lDQogIGxlZnRfam9pbihobm8gJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoYWRtaW4zcGNvZGUgJWluJSBud19wY29kZTMgJg0KICAgICAgICAgICAgICAgICAgICAgICBhZG1pbjJuYW1lX2VuICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsICJKZWJlbCBTYW1hbiIsICJBJ3pheiIsICJKYXJhYmx1cyIsICJBbCBCYWIiKSkgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM3Bjb2RlKSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSksIA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUgDQogIG11dGF0ZSh3b3VuZGVkX2RlYWRfMTAwayA9IHJvdW5kKHdvdW5kZWRfZGVhZCAvIHBvcHVsYXRpb24gKiAxMDAwMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIGRhbWFnZWRfaG91c2VzXzEwMGsgPSByb3VuZChkYW1hZ2VkX2hvdXNlcyAvIHBvcHVsYXRpb24gKiAxMDAwMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogICAgbGVmdF9qb2luKGNiciAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSwgDQogICAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkYW1hZ2VkX2hvdXNlcywgeSA9IHdvdW5kZWRfZGVhZCkpICsgDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSB3b3VuZGVkX2RlYWRfMTAwaywgDQogICAgICAgICAgICAgICAgIGNvbG91ciA9IGJlbmVmaWNpYXJpZXMpKSArIA0KICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gc3ViX2Rpc3RyaWN0KSwNCiAgICAgICAgICAgICAgICAgICBwb2ludC5wYWRkaW5nID0gLjUsIA0KICAgICAgICAgICAgICAgICAgIHNlZ21lbnQuY29sb3IgPSAiZ3JleTUwIiwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfeF9sb2cxMChsYWJlbHMgPSBjb21tYSkgKyANCiAgc2NhbGVfeV9sb2cxMChsYWJlbHMgPSBjb21tYSkgKyANCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXMob3B0aW9uID0gIm1ha28iLCBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hKSArIA0KICBzY2FsZV9zaXplKGJyZWFrcyA9IGMoMCwgMTAwLCA1MDAsIDEwMDAsIDMwMDApKSArIA0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGRhbWFnZWQgaG91c2VzIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2Ygd291bmRlZCBhbmQgZGVhZCIsIA0KICAgICAgIHRpdGxlID0gIk1hZ25pdHVkZSBvZiBlYXJ0aHF1YWtlIGltcGFjdHMgYnkgc3ViLWRpc3RyaWN0IiwgDQogICAgICAgc3VidGl0bGUgPSAiU2l6ZSBzaG93cyBzZXZlcml0eSAod291bmRlZC9kZWFkIHBlciAxMDBrKSBhbmQgY29sb3VyIHNob3dzIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICBzaXplID0gIldvdW5kZWQvZGVhZFxucGVyIDEwMGsiLCANCiAgICAgICBjb2xvdXIgPSAiQmVuZWZpY2lhcmllcyIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBmcm9tIENXRywgRlNMIGFuZCBBQ1UiKQ0KYGBgDQoNCjxicj4NCg0KVGhlIENXRyBpcyBjdXJyZW50bHkgd29ya2luZyBvbiBhIHByaW9yaXRpc2F0aW9uIHNjb3JlLCB3aGljaCBjYW4gYmUgYSB1c2VmdWwgc2hvcnRoYW5kIChvciBjcnV0Y2gpLCB0aGF0IHdpbGwgdGFrZSBpbnRvIGFjY291bnQgcHJlLWV4aXN0aW5nIHZ1bG5lcmFiaWxpdHkgKGxpa2VseSBmcm9tIHRoZSBNU05BKSBhcyB3ZWxsIGFzIGVhcnRocXVha2UgaW1wYWN0cy4gDQoNCjxicj48YnI+DQoNCg0KIyMjIDMuMyBQbGFubmVkIGFjdGl2aXRpZXMgDQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJQbGFubmVkIikgJT4lDQogIGZpbHRlcihnb3Zlcm5vcmF0ZSA9PSAiQWxlcHBvIikgJT4lICANCiAgZ3JvdXBfYnkoc3ViX2Rpc3RyaWN0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGZjdF9yZW9yZGVyKHN1Yl9kaXN0cmljdCwgYmVuZWZpY2lhcmllcykpKSArIA0KICBnZW9tX2NvbChmaWxsID0gIiM0MWI2YzQiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIA0KICBsYWJzKHRpdGxlID0gIlBsYW5uZWQgYmVuZWZpY2lhcmllcyAtLSBBbGVwcG8iLCANCiAgICAgICB4ID0gIlBsYW5uZWQgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHkgPSAiIikgKyANCg0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJQbGFubmVkIikgJT4lDQogIGZpbHRlcihnb3Zlcm5vcmF0ZSA9PSAiSWRsZWIiICYgIWlzLm5hKGFkbWluM3Bjb2RlKSkgJT4lICANCiAgZ3JvdXBfYnkoc3ViX2Rpc3RyaWN0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGZjdF9yZW9yZGVyKHN1Yl9kaXN0cmljdCwgYmVuZWZpY2lhcmllcykpKSArIA0KICBnZW9tX2NvbChmaWxsID0gImxpZ2h0Z29sZGVucm9kIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCBoanVzdCA9ICJpbndhcmQiKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSB1bml0X2Zvcm1hdCh1bml0ID0gIksiLCBzY2FsZSA9IDFlLTMsIGFjY3VyYWN5ID0gMSkpICsgDQogIGxhYnModGl0bGUgPSAiSWRsZWIiLCANCiAgICAgICB4ID0gIlBsYW5uZWQgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHkgPSAiIikgICsgDQoNCiAgcGxvdF9sYXlvdXQod2lkdGhzID0gYygyLCAzKSkNCg0KIyBnZ3NhdmUoIi4vaW1nL3BsYW5uZWRfYnlfc3ViX2Rpc3RyaWN0LnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gOC4yNywgd2lkdGggPSAxMS42OSwgdW5pdHMgPSAiaW4iKQ0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMgNC4gQ2FzaCByZXNwb25zZSBhY3RvcnMgYW5kIGNhc2ggZGlzYnVyc2VkDQoNCkluIHRoZSBzY2F0dGVycGxvdCBiZWxvdywgZWFjaCBwb2ludCBpcyBhIHNpbmdsZSBjYXNoIHdvcmtpbmcgZ3JvdXAgcGFydG5lci4gVGhlIHgtYXhpcyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgcGVyIGFnZW5jeSBhbmQgdGhlIHktYXhpcyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjb21tdW5pdGllcyAoYWRtaW40KSByZWFjaGVkLiANCg0KPGJyPg0KDQpgYGB7ciB0b3RhbHMsIGV2YWwgPSBGQUxTRX0NCg0KZnNsICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5ID09ICJDYXNoIFJlc3BvbnNlIiAmIHBsYW5uZWRfaW1wbGVtZW50ZWQgPT0gIkltcGxlbWVudGVkIikgJT4lIA0KICBtdXRhdGUodXNkX3RvdGFsID0gZmFtaWxpZXMgKiBxdWFudGl0eSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIHVzZF90b3RhbCA9IHN1bSh1c2RfdG90YWwsIG5hLnJtID0gVFJVRSkpDQoNCmBgYA0KDQoNCg0KDQpgYGB7ciBwYXJ0bmVyLXNjYXR0ZXJ9DQpwYXJ0bmVyX3NjYXR0ZXIgPC0gY2JyICU+JSANCiAgIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lciwgDQogICAgICAgICAgIGFkbWluMnBjb2RlLCANCiAgICAgICAgICAgYWRtaW40cGNvZGUpICU+JSANCiAgc2xpY2Uod2hpY2gubWF4KGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgY29tbXVuaXRpZXMgPSBuX2Rpc3RpbmN0KGFkbWluNHBjb2RlKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gY29tbXVuaXRpZXMpKSArDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChpbXBsZW1lbnRpbmdfcGFydG5lciwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlbmVmaWNpYXJpZXM6ICIsIGZvcm1hdChiZW5lZmljaWFyaWVzLCBiaWcubWFyayA9ICIsIiksICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tdW5pdGllczogIiwgY29tbXVuaXRpZXMpKSkgKyANCiAgc2NhbGVfeF9sb2cxMChsYWJlbHMgPSBjb21tYSkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIA0KICBsYWJzKHggPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIiwgDQogICAgICAgeSA9ICJDb21tdW5pdGllcyAoYWRtaW40KSByZWFjaGVkIiwgDQogICAgICAgdGl0bGUgPSAiSW1wbGVtZW50aW5nIHBhcnRuZXJzIC0tIGJlbmVmaWNpYXJpZXMgYW5kIGNvbW11bml0aWVzIHJlYWNoZWQiKQ0KDQpnZ3Bsb3RseShwYXJ0bmVyX3NjYXR0ZXIsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpICU+JSANCiAgbGF5b3V0KHNob3dsZWdlbmQgPSBUUlVFLCBsZWdlbmQgPSBsaXN0KGZvbnQgPSAobGlzdChzaXplID0gNikpKSkgJT4lIA0KICBwbG90bHk6OnN0eWxlKGhvdmVyb24gPSAicG9pbnQiKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiQmVuZWZpY2lhcmllcyBhbmQgY29tbXVuaXRpZXMgcmVhY2hlZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhc2ggcmVzcG9uc2UgaW1wbGVtZW50aW5nIHBhcnRuZXJzOyBtb3VzZSBvdmVyIGZvciBkZXRhaWxzIiwiPC9zdXA+IikpKQ0KDQoNCmBgYA0KDQo8YnI+DQoNClVTRCBgciBwYXN0ZShyb3VuZChjYnIgJT4lIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF91c2QpfSAvIDEwMDAwMDAsIGRpZ2l0cyA9IDEpLCAibWlsbGlvbiIpYCBoYXMgYmVlbiBkaXN0cmlidXRlZCBhY3Jvc3MgYHIgY2JyICU+JSBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7bl9kaXN0aW5jdCguJGFkbWluNHBjb2RlKX1gIGNvbW11bml0aWVzIGFuZCBgciBjYnIgJT4lIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtuX2Rpc3RpbmN0KC4kYWRtaW4zcGNvZGUpfWAgc3ViLWRpc3RyaWN0cyBpbiBOVyBTeXJpYS4NCg0KDQpUaGUgdGFibGUgYmVsb3cgc3VtbWFyaXNlcyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHNjYXR0ZXJwbG90IGFib3ZlIGluIHRhYnVsYXIgZm9ybToNCg0KPGJyPg0KDQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyLCANCiAgICAgICAgICAgYWRtaW4ycGNvZGUsIA0KICAgICAgICAgICBhZG1pbjRwY29kZSkgJT4lIA0KICBzbGljZSh3aGljaC5tYXgoYmVuZWZpY2lhcmllcykpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBkaXN0cmljdHMgPSBuX2Rpc3RpbmN0KGFkbWluMnBjb2RlKSwgDQogICAgICAgICAgICBjb21tdW5pdGllcyA9IG5fZGlzdGluY3QoYWRtaW40cGNvZGUpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJSZWFjaCBhbmQgZm9vdHByaW50IG9mIGNhc2ggcmVzcG9uc2UgYWN0b3JzIikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC44KSAlPiUgDQogIGZvb3Rub3RlKGFzX3BhcmFncmFwaCgiT25seSBwYXJ0bmVycyB3aG8gcHJvdmlkZWQgbW9yZSB0aGFuIFVTRCAxMDAvZmFtaWx5L21vbnRoIiksIA0KICAgICAgICAgICBpID0gMSwgaiA9IDEsIHBhcnQgPSAiaGVhZGVyIiwgaW5saW5lID0gVFJVRSkNCiAgDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDQuMSBVU0QgZGlzYnVyc2VkIHBlciBwYXJ0bmVyDQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF91c2QgPSBzdW0odG90YWxfdXNkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGZhbWlsaWVzID0gc3VtKGZhbWlsaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZSh1c2RfcGVyX2ZhbSA9IHJvdW5kKHRvdGFsX3VzZCAvIGZhbWlsaWVzLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBgJV91c2RfdG90YWxgID0gcm91bmQodG90YWxfdXNkIC8gc3VtKHRvdGFsX3VzZCkgKiAxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyh0b3RhbF91c2QpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIlVTRCBkaXNidXJzZWQgYW5kIGZhbWlsaWVzIHJlYWNoZWQgYnkgcGFydG5lciIpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIGZsZXh0YWJsZTo6c2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC44KQ0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNClRoZSBDV0cgaXMgY3VycmVudGx5IHdvcmtpbmcgd2l0aCBvdGhlciBDbHVzdGVycyB0byBjb25zb2xpZGF0ZSBhbGwgY2FzaC1iYXNlZCBhY3Rpdml0aWVzIGFuZCB3aWxsIHNvb24gYmUgYWJsZSB0byBwcm92aWRlIG1vcmUgY29tcHJlaGVuc2l2ZSByZXBvcnRpbmcuIA0KDQojIDUgQW5uZXhlcw0KDQo8YnI+DQoNCiMjIyA1LjEgSW50ZXJhY3RpdmUgcmVmZXJlbmNlIHRhYmxlIGF0IHN1Yi1kaXN0cmljdCBsZXZlbA0KDQpDb2x1bW5zIGluY2x1ZGU6IA0KYGdvdmVybm9yYXRlYCwgYGRpc3RyaWN0YCwgYHN1Yi1kaXN0cmljdGAsIA0KYHRvdGFsIHBvcHVsYXRpb25gLCBgYmVuZWZpY2lhcmllc2AsIGB0b3RhbCB1c2QgZGlzYnVyc2VkYCwgDQpgd291bmRlZCBhbmQgZGVhZGAsIGB3b3VuZGVkIGFuZCBkZWFkIHBlciAxMDBrYCwgDQpgZGFtYWdlZCBob3VzZXNgLCBgZGFtYWdlZCBob3VzZXMgcGVyIDEwMGtgLCANCmBhZG1pbjNwY29kZWANCg0KYGBge3J9DQplcSAlPiUgDQogIGxlZnRfam9pbihsb2NhdGlvbnMgJT4lIGRpc3RpbmN0KGFkbWluM3Bjb2RlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9kaXN0cmljdCA9IGFkbWluM25hbWVfZW4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmljdCA9IGFkbWluMm5hbWVfZW4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3Zlcm5vcmF0ZSA9IGFkbWluMW5hbWVfZW4pLCANCiAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lIA0KICBsZWZ0X2pvaW4oY2JyICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfdXNkID0gc3VtKHRvdGFsX3VzZCwgbmEucm0gPSBUUlVFKSksIA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUgDQogIHNlbGVjdChnb3Zlcm5vcmF0ZSwgZGlzdHJpY3QsIHN1Yl9kaXN0cmljdCwgDQogICAgICAgICB0b3RhbF9wb3B1bGF0aW9uLCANCiAgICAgICAgIGJlbmVmaWNpYXJpZXMsIHRvdGFsX3VzZCwgDQogICAgICAgICB3b3VuZGVkX2RlYWQsIHdvdW5kZWRfZGVhZF8xMDBrLCANCiAgICAgICAgIGRhbWFnZWRfaG91c2VzLCBkYW1hZ2VkX2hvdXNlc18xMDBrLCANCiAgICAgICAgIGFkbWluM3Bjb2RlKSAlPiUgDQogIGRhdGF0YWJsZShvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFKSwgDQogICAgICAgICAgICBmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOjEyMCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVmZXJlbmNlIHRhYmxlIC0tIEVhcnRocXVha2UgaW1wYWN0cywgZnJvbSBBQ1UsIGV4dHJhY3RlZCAyMDIzMDMyOCIpKSAlPiUgDQogIGZvcm1hdFN0eWxlKDAsIHRhcmdldCA9ICJyb3ciLCBsaW5lSGVpZ2h0ID0gIjgwJSIsIGZvbnRTaXplID0gIjgwJSIpICU+JSANCiAgZm9ybWF0Um91bmQoYygid291bmRlZF9kZWFkXzEwMGsiLCAiZGFtYWdlZF9ob3VzZXNfMTAwayIpLCBkaWdpdHMgPSAyKSAlPiUgDQogIGZvcm1hdEN1cnJlbmN5KGMoInRvdGFsX3BvcHVsYXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAid291bmRlZF9kZWFkIiwgImRhbWFnZWRfaG91c2VzIiwgDQogICAgICAgICAgICAgICAgICAgImJlbmVmaWNpYXJpZXMiLCAidG90YWxfdXNkIiksIA0KICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLCBpbnRlcnZhbCA9IDMsIG1hcmsgPSAiLCIpICU+JQ0KICBmb3JtYXRSb3VuZChjKCJ0b3RhbF9wb3B1bGF0aW9uIiwgDQogICAgICAgICAgICAgICAgIndvdW5kZWRfZGVhZCIsICJkYW1hZ2VkX2hvdXNlcyIsDQogICAgICAgICAgICAgICAgImJlbmVmaWNpYXJpZXMiLCAidG90YWxfdXNkIiksIGRpZ2l0cyA9IDApDQogIA0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA1LjIgUmVwb3J0aW5nIHF1YWxpdHkgDQoNClRoaXMgc2VjdGlvbiBkb2N1bWVudHMgaXNzdWVzIGVuY291bnRlcmVkIGluIHRoZSBjbGVhbmluZyBvZiA0VyBhbmQgRlNMIGRhdGEgYW5kIHRoZWlyIGltcGFjdHMgb24gdGhlIHF1YWxpdHkgb2YgcmVwb3J0aW5nIHRoZSBDV0cgY2FuIHByb3ZpZGUuIA0KDQpOb3RlIHRoYXQgc3Vic3RhbnRpYWwgY2xlYW5pbmcgaGFzIGFscmVhZHkgdGFrZW4gcGxhY2UgYW5kIHRoZXNlIG91dHN0YW5kaW5nIGlzc3VlcyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgYnkgdGhlIHRpbWUgb2YgcmVwb3J0aW5nLiANCg0KSG93ZXZlciwgdGhlIENXRyByZWNvZ25pc2VzIHRoYXQgbm90IGFsbCByZXBvcnRpbmcgaXNzdWVzIHdlcmUgZHVlIHRvIHBhcnRuZXIgZXJyb3IuIFRoZSBDV0cgd2lsbCB3b3JrIHdpdGggcGFydG5lcnMgdG8gY29udGludWUgaW1wcm92aW5nIHJlcG9ydGluZyBxdWFsaXR5LiANCg0KPGJyPiANCg0KYGBge3J9DQpjYnIgJT4lIA0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoc291cmNlKSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUoYCVfYmVuZWZpY2lhcmllc2AgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJTdGlsbCwgb25lIHRoaXJkIG9mIHJlcG9ydGluZyBvcmlnaW5hdGVzIGZyb20gdGhlIEZTTCB0cmFja2VyIikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JQ0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjYpDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmNiciAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShtb250aCA9IG1vbnRoKGRpc3RyaWJ1dGlvbl9kYXRlLCBsYWJlbCA9IFRSVUUpKSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUoYCVfYmVuZWZpY2lhcmllc2AgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJKYW51YXJ5IHJlcG9ydGluZyBpcyBzdGlsbCBsYXJnZWx5IGluY29tcGxldGUiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuNikNCmBgYA0KDQo8YnI+IA0KDQpBY3Rpdml0aWVzIHBlcnRhaW5pbmcgdG8gMTQsNDMyIHdlcmUgbWlzc2luZyB0aGVpciBkYXRlIG9yIGhhZCBkYXRlcyBpbiB1bnJlYWRhYmxlIGZvcm1hdHMuIEhvd2V2ZXIsIHRoZSBjb2x1bW5zIGBzdGFydCBkYXRlYCwgYGVuZCBkYXRlYCBhbmQgYG1vbnRoIG9mIHJlcG9ydGluZ2Agd2VyZSBzb21lIG9mIHRoZSBtb3N0IHRyb3VibGVzb21lIGFuZCBjb25zdW1lZCBhIGxhcmdlIHBhcnQgb2YgdGhlIHRpbWUgZGVkaWNhdGVkIHRvIGRhdGEgY2xlYW5pbmcuIA0KDQpUaGUgQ1dHIHdvdWxkIGxpa2UgdG8gcmVpdGVyYXRlIHRoYXQgYHN0YXJ0IGRhdGVgIGFuZCBgZW5kIGRhdGVgIHNob3VsZCBiZSBlbnRlcmVkIGluIHRoZSBmb3JtYXQgbW0vZGQveXl5eSBhbmQgdGhhdCBgbW9udGggb2YgcmVwb3J0aW5nYCBzaG91bGQgYmUgc2VsZWN0ZWQgZnJvbSB0aGUgZHJvcGRvd24gbWVudS4gDQoNCjxicj4NCg0KYGBge3J9DQpjYnIgJT4lIGdyb3VwX2J5KHByb2plY3Rfc3RhdHVzKSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUoYCVfYmVuZWZpY2lhcmllc2AgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCIxMiBwYXJ0bmVycyBoYXZlIHJlcG9ydGVkIHBsYW5uZWQgYWN0aXZpdGllcyIpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUNCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC42KQ0KYGBgDQoNCjxicj4NCg0KVGhlIHN1bSBvZiBwbGFubmVkIGJlbmVmaWNpYXJpZXMgaXMgYHIgZm9ybWF0KGZpbHRlcihjYnIsIHByb2plY3Rfc3RhdHVzID09ICJQbGFubmVkIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzKX0sIGJpZy5tYXJrID0gIiwiKWAuIElmIHRoaXMgaXMgdGhlIGV4dGVudCBvZiBhbGwgcGxhbm5lZCBNUEMgYWN0aXZpdGllcywgdGhlIENXRyBhcyBhIHdob2xlIGNhbiBleHBlY3QgdG8gcmVhY2ggYXJvdW5kIDc3JSBvZiBpdHMgdGFyZ2V0IG9mIDY2Miw5NDIgcGVyc29ucy4gDQoNCkJlbG93IGlzIGEgYnJlYWtkb3duIG9mIHBsYW5uZWQgYWN0aXRpdml0aWVzIGJ5IHNvdXJjZToNCg0KPGJyPg0KDQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJQbGFubmVkIikgJT4lIA0KICBncm91cF9ieShzb3VyY2UpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIkJyZWFrZG93biBvZiBwbGFubmVkIGFjdGl2aXRpZXMgYnkgc291cmNlIikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JQ0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjYpDQpgYGANCg0KDQoNCg0KDQoNCg0K